//
//  Town.swift
//  MonsterTown
//
//  Created by liuzhu on 2018/9/26.
//  Copyright © 2018 liuzhu. All rights reserved.
//

import Foundation
//声明结构体
struct Town {
    var population = 5422
    {
        didSet(oldPopulation)
        {
            print("The population ha changed to \(population) from \(oldPopulation)")
        }
    }
    var numberOfStopLights = 4
    
    enum Size
    {
        case small
        case medium
        case large
    }
    
    //惰性存储
    //lazy ：意味着程序只有在第一次访问townSize的时候才会计算它的值，lazy的属性只会被计算一次
    lazy var townSize:Size = {
        switch self.population
        {
        case 0...10000:
            return Size.small
        case 10001...100000:
            return Size.medium
        default:
            return Size.large
        }
    }()//这对园括号和惰性加载的标记一 起确保了Swift会在我们第一次访问这个属性的时候调用闭包并将结果赋给它。如果省略了园括 号，那就只是把闭包赋给townSize属性。有了园括号，闭包会在我们第一次访问townSize属性的时候得到执行。
    
    func printDescription()  {
        print("Population:\(population);number of stoplights:\(numberOfStopLights)");
    }
    
    //如果结构体的一个实例方法要修改结构体的属性，就必须标记为mutating。
    mutating func changePopulation(by amount:Int){
        population += amount
    }
    
    
    //计算属性。提供getter和setter方法，让计算属性的值可以发生变化
    var townSize1: Size
    {
        get
        {
            switch self.population
            {
            case 0...10000:
                return Size.small
            case 10001...100000:
                return Size.medium
            default:
                return Size.large
            }
        }
    }
    
    
    
    
    
    
    
}



